Memoria virtuale
In informatica, la memoria virtuale č uno spazio di memoria non fisicamente presente, ma che può essere emulata utilizzando altri dispositivi, per esempio l'unitĂ a disco. La memoria effettivamente presente diventa quindi la parte temporaneamente utilizzata di quella, piů grande, virtuale.Per poter funzionare un sistema operativo ha necessitĂ di occupare spazio all'interno della memoria principale (memoria RAM) dove, oltre a se stesso, deve caricare anche i programmi in esecuzione ed i dati su cui si sta lavorando. Il processore infatti può prelevare tali informazioni solo all'interno della memoria principale. Può capitare, però, che la quantitĂ di memoria totale occupata dal sistema sia molto elevata, e che la quantitĂ di memoria fisica disponibile non sia sufficiente. Una tecnica comunemente usata per ovviare a questo problema č quello di mantenere all'interno della memoria secondaria (solitamente hard disk) parte di queste informazioni, per trasferirle nella memoria principale soltanto quando siano effettivamente necessarie. La memoria secondaria utilizzata a questo scopo č comunemente chiamata swap (verbo inglese che significa "scambiare") e costituisce la memoria virtuale. Le operazioni di spostamanto delle pagine sono chiamate swapping. Con questa tecnica č così possibile disporre di una ben maggiore quantitĂ di memoria, aumentando pertanto il numero di programmi che č possibile eseguire contemporaneamente.
Table of contents |
2 Algoritmi di swapping |
Ad esempio supponiamo che in un dato momento la memoria fisica sia satura e contenga esattamente la localitĂ del sistema e che in questa situazione viene avviato un nuovo programma. Il processo che viene creato ha bisogno di allocare della memoria. Dato però che la memoria principale č piena il sistema operativo provvede a liberare parte dello spazio memorizzando parte delle informazioni nella memoria secondaria. Sucessivamente, quando il controllo torna al processo i cui dati sono stati appena spostati, viene nuovamente richiesta un'operazione di swapping per ricaricare in memoria principale gli stessi. Dato che tutte le informazioni contenute nella memoria princiale sono indispensabili questo fenomeno avviene molto spesso. Essendo la memoria secondaria molto piů lenta (centinaia o migliaia di volte) rispetto alla memoria principale, questo causa un considerevole rallentamento del sistema, che č impegnato quasi esclusivamente in operazioni di I/O, e diventa presto inutilizzabile e poco, o per nulla, responsivo ai comandi dell'utente. Tale fenomeno č chiamato trashing.
Questo algoritmo č molto semplice e di rapida esecuzione ma ha lo svantaggio di spostare in memoria secondaria le pagine piů vecchie anche sono utilizzate.
Nel caso peggiote tutte le pagine hanno il bit impostato ad 1, in questo caso l'algoritmo azzera tutti i bit fino a tornare alla prima pagina presa in esame. Trovandola ora con bit a 0 provvede alla sua sostituzione. In questo caso la sostituzione a seconda scelta si ridure ad una sostituzione di tipo FIFO.
Esiste una versione modificata del seguente algoritmo che prevede due bit che tengono traccia dell'uso e della modifica. Si hanno infatti le seguenti combinazioni:
Per gestire efficientemente quest'algoritmo occorre supporto hardware. È possibile implementare questa tecnica in due modi: si può aggiornare ad ogni accesso della memoria una tabella oppure si mantiene uno stack con le pagine utilizzate piů recentemente poste in cima. Entrambi i metodi hanno un impatto non indifferente sulle prestazioni del sistema e per questo motivo normalmente sono realizzati in hardware.Trashing
È indispensabile che la quantitĂ di memoria fisica presente sia almeno sufficiente a mantenere la localitĂ del sistema, ovvero quella parte di dati ed informazioni che sono utilizzate nell'immediato da ogni processo. Se così non fosse, infatti, il sistema dovrebbe continuamente provvedere ad eseguire delle operazioni di swapping per far si che ogni processo abbia i dati di cui necessita.Algoritmi di swapping
Esistono varie tecniche per decire quali sono le aree di memoria che č preferibile spostare dalla memoria primaria alla secondaria. Le seguenti sono le piů diffuse:FIFO
La tecnica FIFO (First In First Out) č la piů semplice, si tiene traccia in una tabella di quando č stata allocata un'area di memoria. Quando vi č una nuova richiesta di allocazione di pagine di memoria, se c'č ancora spazio in memoria principale, semplicemente viene allocata la nuova pagina, altrimenti si consulta mediante la tabella quali sono le pagine allocate da piů tempo e si spostano in memoria secondaria.Seconda scelta
Esiste una semplice ottimizzazione della tecnica FIFO che ovvia al problema dello swap anche delle pagine molto utilizzate. È sufficiente aggiungere un bit nella tabella che tiene traccia dell'etĂ delle pagine: ogni volta che il sistema operativo accede ad una pagine, pone questo bit ad 1 mentre l'algoritmo di swap delle pagine, se trova il bit a 1 lo pone a 0 e sposta in memoria secondaria una pagina con il bit giĂ posto a 0. In questo modo, le pagine utilizzate di frequente hanno alta probabilitĂ di rimanere in meoria principale.
Quando č necessario effettuare una sostituzione di pagina l'algoritmo prima cerca la pagina migliore da sostituire considerando non solo il fatto che essa non sia stata usata recentemente ma anche che non sia stata modificata. Infatti quando la pagina č stata modificata č necessario salvarne nuovamente il contenuto all'interno della memoria secondaria. Se invece non č stata modificata, ed č giĂ presente una copia nella memoria secondaria, non č necessario effettuare alcuna operazione di I/O.LRU
La migliore soluzione possibile consisterebbe nello spostare le pagine che non saranno usate per piů tempo ma naturalmente il sistema operativo non č in grado di avere quest'informazione. La soluzione di compromesso consiste nello spostare le pagine inutilizzate da piů tempo (LRU cioč Least Recently Used) poichĂ© hanno buona probabilitĂ di non essere nuovamente utilizzate nell'immediato.